<?php

namespace App\Events\Plane\PlaneOrder;

use App\Models\Plane\PlaneOrders\PlaneOrder;
use App\Models\Plane\PlaneOrders\Repositories\Interfaces\PlaneOrderRepositoryInterface;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;


class PlaneOrderStateUpdatedEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * 当广播事件在数据库事务中被分派时，它们可能在数据库事务提交之前由队列处理。
     * 发生这种情况时，您在数据库事务期间对模型或数据库记录所做的任何更新可能尚未反映在数据库中。
     * 此外，在事务中创建的任何模型或数据库记录可能不存在于数据库中。
     * 如果您的事件依赖于这些模型，则在处理广播事件的作业时可能会出现意外错误。
     * @var bool
     */
    public             $afterCommit = true;
    public             $order_info;
    public             $other_change_orders;
    public             $origin_order_info;
    private PlaneOrder $order;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(PlaneOrder $order)
    {
        $this->order               = $order;
        $deal                      = function ($order) {
            $orderRepo = app(PlaneOrderRepositoryInterface::class);
            return $orderRepo->getOrderShowInfoDatasByPlaneOrder($order);
        };
        $orderShowData             = $deal($order);
        $this->order_info          = $orderShowData['order_info'];
        $this->other_change_orders = $orderShowData['other_change_orders'];
        $this->origin_order_info   = $orderShowData['origin_order_info'];
    }

    /**
     * Channel 公共 privateChannel 私有需要认证
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel("plane_orders.{$this->order->getOrderSn()}");
    }

    /**
     * The event's broadcast name.
     * 如果要 监听 需要 去掉命名空间   .listen('.order_state_updated') ` . ` 的作用是去掉命名空间
     * laravel-echo 监听默认命名空间  App\Events(可省略) ->当前类则要写成 .listen('Train\\TrainOrder\\TrainOrderStateUpdatedEvent')
     *
     * @return string
     */
    public function broadcastAs()
    {
        return 'plane_order.state.updated';
    }

    /**
     * 判定事件是否广播
     *
     * 如果只想 广播 已支付 已取消等 可以加逻辑
     *
     * @return bool
     */
    public function broadcastWhen()
    {
        return true;
    }
}
